<?php
/**
 * User: Sergey I. Mokhov
 * Класс работы с HTTP запросом.
 */


class Engine_Http_Request {

    private $module;
    private $controller;
    private $action;

    public $params;
    public $get;
    public $post;

    // Конструктор
    public function __construct(){

        // Получаем запрос и разбиваем его
        $httpRequest = explode('/',$_SERVER['REQUEST_URI']);

        $config = Application_Bootstrap::getConfig();

        //Вытаскиваем модуль, контроллер и действие, а если нет, то берем из конфига
        $this->module       = isset($httpRequest[1]) && !empty($httpRequest[1]) ? $httpRequest[1] : $config['defaults']['defaultModule'];
        $this->controller   = isset($httpRequest[2]) && !empty($httpRequest[2]) ? $httpRequest[2] : $config['defaults']['defaultController'];
        $this->action       = isset($httpRequest[3]) && !empty($httpRequest[3]) ? $httpRequest[3] : $config['defaults']['defaultAction'];

        //Если есть что-то еще, то это параметры
        if (count($httpRequest) > 4) {
           for ($i = 4; $i < count($httpRequest)-1; $i++) {
                if (isset($httpRequest[$i]) && isset($httpRequest[$i+1]) && !empty($httpRequest[$i]) && !empty($httpRequest[$i+1])) {
                    $this->params[htmlentities($httpRequest[$i])] = htmlentities($httpRequest[$i+1]);
                }
                $i++;
            }
        }

        // А вдруг что-то пришло через POST
        if (isset($_REQUEST) && !empty($_REQUEST))
        {
            foreach ($_REQUEST as $key=>$value) {
                $this->params[$key] = $value;
            }
        }
    }

    /** Магический геттер
     * @param $name
     * @return mixed
     */
    function __get($name)
    {
        return $this->{$name};
    }

    /** Получить все параметры
     * @return array
     */
    public function getParams() {
        return $this->params;
    }

    /** Получить один параметр
     * @param $name
     * @param bool $default
     * @return bool
     */
    public function getParam($name, $default = false) {
        if (isset($this->params[$name])) {
            return $this->params[$name];
        } else {
            return $default;
        }
    }

    /**
     * Перенаправление
     * @param $url
     */
    public function redirect($url) {
        header('Location: ' . $url);
        ob_flush();
        die();
    }

    /** Получить данные авторизации из сессии
     * @return array || false
     */
    public function getAuthData() {
        return isset($_SESSION['auth']) ? $_SESSION['auth'] : false; 
    }

    /**
     * Ошибки формы из сессии
     * @param string $formName
     * @return null
     */
    public function getFormErrors($formName = 'form') {
        if (!isset($_SESSION['errors'])) {
            return null;
        } else {
                return isset($_SESSION['errors'][$formName]) ? $_SESSION['errors'][$formName] : null;
        }
    }

    /** Добавить ошибку в сессию
     * @param $value
     * @param string $formName
     */
    public function addFormError($value, $formName = 'form') {
            $_SESSION['errors'][$formName][] = $value;
    }

    /**
     * @param $data
     * @param string $formName
     */
    public function setFormErrors($data, $formName = 'form') {
            $_SESSION['errors'][$formName] = $data;
    }

    /** Очистить ошибки
     * @param string $formName
     */
    public function clearFormErrors($formName = 'form') {
            unset($_SESSION['errors'][$formName]);
    }

}
